﻿#ifndef IPlcBaseItem_H
#define IPlcBaseItem_H

#if _MSC_VER >= 1600
#pragma execution_character_set("utf-8")
#endif

#include <QGraphicsObject>

#include <QString>

//所有PLC基础图元的基类

class IPlcBaseItem : public QGraphicsObject
{
    Q_OBJECT
public:
    IPlcBaseItem(QGraphicsObject *parent = nullptr);

public:
    //获取可编辑状态使能
    virtual bool getEditEnb() { return false; }
    //获取可选中状态使能
    virtual bool getSelectActiveEnb() { return false; }
    //获取选中状态
    virtual bool getSelectActive() { return false; }
    //设置选中状态
    virtual void setSelectActive(bool status) { Q_UNUSED(status); }
    //设置前置信号接通状态
    virtual void setLastSwitchOn(bool value) { Q_UNUSED(value); }
    //设置信号接通状态
    virtual void setSwitchOn(bool value) { Q_UNUSED(value); }

    //获取元件类型
    virtual int8_t getItemType() { return 0; }
    //设置元件类型
    virtual void setItemType(int8_t type) { Q_UNUSED(type); }

    //获取元件变量编号
    virtual QString getVariableNum() { return QString(""); }
    //设置元件变量编号
    virtual void setVariableNum(const QString &str) { Q_UNUSED(str); }

    //获取边界大小
    virtual QRectF getRect() = 0;
    //设置边界大小,并重写绘制图元
    virtual void setRect(const QRectF &rect) = 0;

    //获取分支
    virtual IPlcBaseItem *getBranch() { return nullptr; }
    //设置分支
    virtual void setBranch(IPlcBaseItem *item) { Q_UNUSED(item); }
    //删除分支
    virtual void deleteBranch() {}

    //设置友元
    virtual void setFriend(IPlcBaseItem *item) { Q_UNUSED(item); }
    //获取友元
    virtual IPlcBaseItem *getFriend() { return nullptr; }

    //是否为结束元件
    virtual bool isEnd() { return false; }

    //是否允许包含注释块
    virtual bool haveComment() { return false; }

    //获取唯一选择的图元类
    static IPlcBaseItem *getOnlySelectItem();
    //设置唯一选择的图元类
    static void setOnlySelectItem(IPlcBaseItem *item);

private:
    static IPlcBaseItem *msActiveItem;   //处于活跃选中状态的唯一PLC图元类地址
signals:
};

#endif   // IPlcBaseItem_H
